package Day_0216.JVM.ClassLoader;

/**
 * @author zxc
 * @date 2023/02/16 20:06
 **/
public class Parents_Delegation_Model {
    public static void main(String[] args) {
        /**
         * 谈一谈对于双亲委派模型的理解
         * ===》
         * 1.对于任意一个类，都需要由 加载它的类加载器 && 这个类本身，一同确立该类在 JVM 中的唯一性;
         * 每一个类加载器，都有一个独立的类名称空间。
         * 类加载器,是根据指定全限定名称,将 class 文件加载到 JVM 内存，然后再转化为 class 对象。
         *
         * 2.类加载器分类：
         * （1）启动类加载器（Bootstrap ClassLoader），是虚拟机自身的一部分;
         *  用来加载Java_HOME/lib/目录中的，或者被 -Xbootclasspath 参数所指定的路径中并且被虚拟机识别的类库;
         *
         * （2）扩展类加载器（Extension ClassLoader）：
         *  负责加载\lib\ext目录或Java. ext. dirs系统变量指定路径中的所有类库;
         *
         * （3）应用程序类加载器（Application ClassLoader）：
         *  负责加载用户类路径（classpath）上的指定类库，我们可以直接使用这个类加载器。
         *  一般情况，如果没有自定义类加载器,默认就是用这个加载器。
         *
         * 3.双亲委派模型：
         * （1）如果一个类加载器收到了类加载的请求;
         * （2）首先不会自己去加载这个类，而是把这个请求委派给父类加载器去完成，每一层的类加载器都是如此;
         * （3）这样，所有的加载请求都会被传送到顶层的启动类加载器中;
         * （4）只有当父加载器无法完成加载请求（它的搜索范围中没找到所需的类）时，子加载器才会尝试去加载类。
         * ===》
         * 总结 ：
         * （1）当某个类加载器收到了类加载请求时，不会自己先去加载这个类，而是将其委派给父类，由父类去加载;
         * （自底向上委派类加载请求）
         * （2）如果此时父类不能加载，反馈给子类，由子类去完成类的加载。
         * （自顶向下进行类加载）
         *
         * 4.如何打破双亲委派机制
         * ===》 打破双亲委派机制，则不仅要继承ClassLoader类 && 还要重写loadClass和findClass方法。
         *
         */
    }
}
